--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/ui/utilities.py 2.0.1 (486a97e4) Text, 19.37 KB
T8b949e# Copyright (c) 2026 Mark Qvist - See LICENSE.md and README.md
Tff7b72import T7ee787time
Tff7b72import T7ee787RNS
Tff7b72from T7ee787typing Tff7b72import Te6edf3Union
Tff7b72from T7ee787kivyT7ee787.T7ee787metrics Tff7b72import Te6edf3dpTb4b4b4,Te6edf3sp
Tff7b72from T7ee787kivyT7ee787.T7ee787langT7ee787.T7ee787builder Tff7b72import Te6edf3Builder
Tff7b72from T7ee787kivyT7ee787.T7ee787coreT7ee787.T7ee787clipboard Tff7b72import Te6edf3Clipboard
Tff7b72from T7ee787kivyT7ee787.T7ee787utils Tff7b72import Te6edf3escape_markup
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787recycleview Tff7b72import Te6edf3MDRecycleView
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787list Tff7b72import Te6edf3OneLineIconListItem
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787button Tff7b72import Te6edf3MDRectangleFlatButton
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787dialog Tff7b72import Te6edf3MDDialog
Tff7b72from T7ee787kivymdT7ee787.T7ee787icon_definitions Tff7b72import Te6edf3md_icons
Tff7b72from T7ee787kivymdT7ee787.T7ee787toast Tff7b72import Te6edf3toast
Tff7b72from T7ee787kivyT7ee787.T7ee787properties Tff7b72import Te6edf3StringPropertyTb4b4b4, Te6edf3BooleanProperty
Tff7b72from T7ee787kivyT7ee787.T7ee787effectsT7ee787.T7ee787scroll Tff7b72import Te6edf3ScrollEffect
Tff7b72from T7ee787kivyT7ee787.T7ee787clock Tff7b72import Te6edf3Clock
Tff7b72from T7ee787sidebandT7ee787.T7ee787sense Tff7b72import Te6edf3Telemeter
Tff7b72import T7ee787threading
Tff7b72from T7ee787datetime Tff7b72import Te6edf3datetime
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72from T7ee787uiT7ee787.T7ee787helpers Tff7b72import Te6edf3ts_format
Tff7b72from T7ee787androidT7ee787.T7ee787permissions Tff7b72import Te6edf3request_permissionsTb4b4b4, Te6edf3check_permission
Tff7b72elseTb4b4b4:
Tff7b72from T7ee787.T7ee787helpers Tff7b72import Te6edf3ts_format
Tff7b72class T56d364UtilitiesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffscreen Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrnstatus_screen Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrnstatus_instance Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflogviewer_screen Tff7b72= Tff7b72None
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffhas_screenTb4b4b4(Ta5d6ff"Ta5d6ffutilities_screenTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffscreen Tff7b72= Te6edf3BuilderTff7b72.Td2a8ffload_stringTb4b4b4(Te6edf3layout_utilities_screenTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffscreenTff7b72.Td2a8ffapp Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp
Tff7b72selfTff7b72.Td2a8ffscreenTff7b72.Td2a8ffdelegate Tff7b72= Tff7b72self
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffadd_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffscreenTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffscreenTff7b72.Td2a8ffidsTff7b72.Td2a8ffutilities_scrollviewTff7b72.Td2a8ffeffect_cls Tff7b72= Te6edf3ScrollEffect
Te6edf3info Tff7b72= Ta5d6ff"Ta5d6ffThis section contains various utilities and diagnostics tools, Ta5d6ff"
Te6edf3info Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ffthat can be helpful while using Sideband and Reticulum.Ta5d6ff"
Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8fftheme_clsTff7b72.Td2a8fftheme_style Tff7b72== Ta5d6ff"Ta5d6ffDarkTa5d6ff"Tb4b4b4:
Te6edf3info Tff7b72= Ta5d6ff"Ta5d6ff[color=#Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdark_theme_text_colorTff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"Tff7b72+Te6edf3infoTff7b72+Ta5d6ff"Ta5d6ff[/color]Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffscreenTff7b72.Td2a8ffidsTff7b72.Td2a8ffutilities_infoTff7b72.Td2a8fftext Tff7b72= Te6edf3info
T8b949e### RNode Flasher
T8b949e######################################
Tff7b72def Td2a8ffflasher_actionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3yes_button Tff7b72= Te6edf3MDRectangleFlatButtonTb4b4b4(Te6edf3textTff7b72=Ta5d6ff"Ta5d6ffLaunchTa5d6ff"Tb4b4b4,Te6edf3font_sizeTff7b72=Te6edf3dpTb4b4b4(T79c0ff18Tb4b4b4)Tb4b4b4, Te6edf3theme_text_colorTff7b72=Ta5d6ff"Ta5d6ffCustomTa5d6ff"Tb4b4b4, Te6edf3line_colorTff7b72=Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffcolor_acceptTb4b4b4, Te6edf3text_colorTff7b72=Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffcolor_acceptTb4b4b4)
Te6edf3no_button Tff7b72= Te6edf3MDRectangleFlatButtonTb4b4b4(Te6edf3textTff7b72=Ta5d6ff"Ta5d6ffBackTa5d6ff"Tb4b4b4,Te6edf3font_sizeTff7b72=Te6edf3dpTb4b4b4(T79c0ff18Tb4b4b4)Tb4b4b4)
Te6edf3dialog Tff7b72= Te6edf3MDDialogTb4b4b4(
Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ffRNode FlasherTa5d6ff"Tb4b4b4,
Te6edf3textTff7b72=Ta5d6ff"Ta5d6ffYou can use the included web-based RNode flasher, by starting SidebandTa5d6ff'Ta5d6ffs built-in repository server, and accessing the RNode Flasher page.Ta5d6ff"Tb4b4b4,
Te6edf3buttonsTff7b72=Tb4b4b4[ Te6edf3no_buttonTb4b4b4, Te6edf3yes_button Tb4b4b4]Tb4b4b4,
T8b949e# elevation=0,
Tb4b4b4)
Tff7b72def Td2a8ffdl_yesTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4:
Te6edf3dialogTff7b72.Td2a8ffdismissTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffwants_flasher_launch Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffstart_webshareTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffcbTb4b4b4(Te6edf3dtTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrepository_actionTb4b4b4(Tb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Te6edf3cbTb4b4b4, T79c0ff0.6Tb4b4b4)
Tff7b72def Td2a8ffdl_noTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4:
Te6edf3dialogTff7b72.Td2a8ffdismissTb4b4b4(Tb4b4b4)
Te6edf3yes_buttonTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_releaseTff7b72=Te6edf3dl_yesTb4b4b4)
Te6edf3no_buttonTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_releaseTff7b72=Te6edf3dl_noTb4b4b4)
Te6edf3dialogTff7b72.Td2a8ffopenTb4b4b4(Tb4b4b4)
T8b949e### rnstatus screen
T8b949e######################################
Tff7b72def Td2a8ffrnstatus_actionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4, Te6edf3from_conversationsTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffhas_screenTb4b4b4(Ta5d6ff"Ta5d6ffrnstatus_screenTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrnstatus_screen Tff7b72= Te6edf3BuilderTff7b72.Td2a8ffload_stringTb4b4b4(Te6edf3layout_rnstatus_screenTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrnstatus_screenTff7b72.Td2a8ffapp Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp
Tff7b72selfTff7b72.Td2a8ffrnstatus_screenTff7b72.Td2a8ffdelegate Tff7b72= Tff7b72self
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffadd_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrnstatus_screenTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrnstatus_screenTff7b72.Td2a8fffrom_conversations Tff7b72= Te6edf3from_conversations
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8fftransitionTff7b72.Td2a8ffdirection Tff7b72= Ta5d6ff"Ta5d6ffleftTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffcurrent Tff7b72= Ta5d6ff"Ta5d6ffrnstatus_screenTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.displayingTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffcurrentTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_rnstatusTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffupdate_rnstatusTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_rnstatus_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffclose_rnstatus_actionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffrnstatus_screenTff7b72.Td2a8fffrom_conversationsTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffclose_sub_utilities_actionTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffclose_any_actionTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffupdate_rnstatus_jobTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrnstatus_instance Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72import T7ee787RNST7ee787.T7ee787UtilitiesT7ee787.T7ee787rnstatus Tff7b72as T7ee787rnstatus
Tff7b72selfTff7b72.Td2a8ffrnstatus_instance Tff7b72= Te6edf3rnstatus
Tff7b72import T7ee787io
Tff7b72from T7ee787contextlib Tff7b72import Te6edf3redirect_stdout
Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffNoneTa5d6ff"
Tff7b72with Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4) Tff7b72as Te6edf3bufferTb4b4b4, Te6edf3redirect_stdoutTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3RNSTff7b72.Td2a8fflogging_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrnstatus_instanceTff7b72.Td2a8ffmainTb4b4b4(Te6edf3rns_instanceTff7b72=Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3output Tff7b72= Te6edf3bufferTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Te6edf3output Tff7b72= Te6edf3outputTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff↑Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftx Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff↓Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrx Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcbTb4b4b4(Te6edf3dtTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrnstatus_screenTff7b72.Td2a8ffidsTff7b72.Td2a8ffrnstatus_outputTff7b72.Td2a8fftext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[font=RobotoMono-Regular][size=Tffd700{Tffa657intTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff12Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff]Tffd700{Te6edf3outputTffd700}Ta5d6ff[/size][/font]Ta5d6ff"
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Te6edf3cbTb4b4b4, T79c0ff0.2Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffcurrent Tff7b72== Ta5d6ff"Ta5d6ffrnstatus_screenTa5d6ff"Tb4b4b4:
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffupdate_rnstatusTb4b4b4, T79c0ff1Tb4b4b4)
T8b949e### Advanced Configuration screen
T8b949e######################################
Tff7b72def Td2a8ffadvanced_actionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffhas_screenTb4b4b4(Ta5d6ff"Ta5d6ffadvanced_screenTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadvanced_screen Tff7b72= Te6edf3BuilderTff7b72.Td2a8ffload_stringTb4b4b4(Te6edf3layout_advanced_screenTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadvanced_screenTff7b72.Td2a8ffapp Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp
Tff7b72selfTff7b72.Td2a8ffadvanced_screenTff7b72.Td2a8ffdelegate Tff7b72= Tff7b72self
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffadd_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffadvanced_screenTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8fftransitionTff7b72.Td2a8ffdirection Tff7b72= Ta5d6ff"Ta5d6ffleftTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffcurrent Tff7b72= Ta5d6ff"Ta5d6ffadvanced_screenTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.displayingTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffcurrentTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_advancedTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffupdate_advancedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3ct Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconfig_templateTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3ct Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3ct Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffdefault_config_template
Tff7b72selfTff7b72.Td2a8ffadvanced_screenTff7b72.Td2a8ffidsTff7b72.Td2a8ffconfig_templateTff7b72.Td2a8fftext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[font=RobotoMono-Regular][size=Tffd700{Tffa657intTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff12Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff]Tffd700{Te6edf3ctTffd700}Ta5d6ff[/size][/font]Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadvanced_screenTff7b72.Td2a8ffidsTff7b72.Td2a8ffconfig_templateTff7b72.Td2a8fftext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[font=RobotoMono-Regular][size=Tffd700{Tffa657intTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff12Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff]On this platform, Reticulum configuration is managed by the system. You can change the configuration by editing the file located at:Tffea00\nTffea00\nTffd700{Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffreticulumTff7b72.Td2a8ffconfigpathTffd700}Ta5d6ff[/size][/font]Ta5d6ff"
Tff7b72def Td2a8ffreset_configTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconfig_templateTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsave_configurationTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_advancedTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffcopy_configTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconfig_templateTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3ClipboardTff7b72.Td2a8ffcopyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconfig_templateTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3ClipboardTff7b72.Td2a8ffcopyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffdefault_config_templateTb4b4b4)
Tff7b72def Td2a8ffpaste_configTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfig_template Tff7b72= Te6edf3ClipboardTff7b72.Td2a8ffpasteTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconfig_templateTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfig_template
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsave_configurationTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_advancedTb4b4b4(Tb4b4b4)
T8b949e### Log viewer screen
T8b949e######################################
Tff7b72def Td2a8fflogviewer_actionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffhas_screenTb4b4b4(Ta5d6ff"Ta5d6fflogviewer_screenTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflogviewer_screen Tff7b72= Te6edf3BuilderTff7b72.Td2a8ffload_stringTb4b4b4(Te6edf3layout_logviewer_screenTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflogviewer_screenTff7b72.Td2a8ffapp Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp
Tff7b72selfTff7b72.Td2a8fflogviewer_screenTff7b72.Td2a8ffdelegate Tff7b72= Tff7b72self
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffadd_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8fflogviewer_screenTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8fftransitionTff7b72.Td2a8ffdirection Tff7b72= Ta5d6ff"Ta5d6ffleftTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffcurrent Tff7b72= Ta5d6ff"Ta5d6fflogviewer_screenTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.displayingTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffcurrentTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_logviewerTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffupdate_logviewerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_logviewer_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffupdate_logviewer_jobTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3output Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffget_logTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3output Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while retrieving log entries:Tffea00\nTffd700{Te6edf3eTffd700}Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3service_output Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3service_output Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffget_service_logTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3service_output Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while retrieving log entries:Tffea00\nTffd700{Te6edf3eTffd700}Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8fflogviewer_screenTff7b72.Td2a8fflog_contents Tff7b72= Te6edf3output
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8fflogviewer_screenTff7b72.Td2a8fflog_contents Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff# Frontend LogTffea00\nTffea00\nTffd700{Te6edf3outputTffd700}Tffea00\nTffea00\nTa5d6ff# Service LogTffea00\nTffea00\nTffd700{Te6edf3service_outputTffd700}Ta5d6ff"
Tff7b72def Td2a8ffcbTb4b4b4(Te6edf3dtTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflogviewer_screenTff7b72.Td2a8ffidsTff7b72.Td2a8fflogviewer_outputTff7b72.Td2a8fftext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[font=RobotoMono-Regular][size=Tffd700{Tffa657intTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff12Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff]Tffd700{Te6edf3outputTffd700}Ta5d6ff[/size][/font]Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflogviewer_screenTff7b72.Td2a8ffidsTff7b72.Td2a8fflogviewer_outputTff7b72.Td2a8fftext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[size=18dp][b]Frontend Log[/b][/size][size=5dp]Tffea00\nTa5d6ff Tffea00\nTa5d6ff[font=RobotoMono-Regular][size=Tffd700{Tffa657intTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff12Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff]Tffd700{Te6edf3outputTffd700}Ta5d6ff[/size][/font]Ta5d6ff"
Tff7b72selfTff7b72.Td2a8fflogviewer_screenTff7b72.Td2a8ffidsTff7b72.Td2a8ffslogviewer_outputTff7b72.Td2a8fftext Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff[size=18dp][b]Service Log[/b][/size][size=5dp]Tffea00\nTa5d6ff Tffea00\nTa5d6ff[font=RobotoMono-Regular][size=Tffd700{Tffa657intTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff12Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff]Tffd700{Te6edf3service_outputTffd700}Ta5d6ff[/size][/font]Ta5d6ff"
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Te6edf3cbTb4b4b4, T79c0ff0.2Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffscreen_managerTff7b72.Td2a8ffcurrent Tff7b72== Ta5d6ff"Ta5d6fflogviewer_screenTa5d6ff"Tb4b4b4: Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffupdate_logviewerTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72def Td2a8fflogviewer_copyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3senderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3ClipboardTff7b72.Td2a8ffcopyTb4b4b4(Tff7b72selfTff7b72.Td2a8fflogviewer_screenTff7b72.Td2a8fflog_contentsTb4b4b4)
Tff7b72if Tff7b72True Tff7b72or Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3toastTb4b4b4(Ta5d6ff"Ta5d6ffLog copied to clipboardTa5d6ff"Tb4b4b4)
Te6edf3layout_utilities_screen Tff7b72= Ta5d6ff"""
Ta5d6ffMDScreen:
Ta5d6ff name: Ta5d6ff"Ta5d6ffutilities_screenTa5d6ff"
Ta5d6ff
Ta5d6ff BoxLayout:
Ta5d6ff orientation: Ta5d6ff"Ta5d6ffverticalTa5d6ff"
Ta5d6ff MDTopAppBar:
Ta5d6ff title: Ta5d6ff"Ta5d6ffUtilitiesTa5d6ff"
Ta5d6ff anchor_title: Ta5d6ff"Ta5d6ffleftTa5d6ff"
Ta5d6ff elevation: 0
Ta5d6ff left_action_items:
Ta5d6ff [[Ta5d6ff'Ta5d6ffmenuTa5d6ff'Ta5d6ff, lambda x: root.app.nav_drawer.set_state(Ta5d6ff"Ta5d6ffopenTa5d6ff"Ta5d6ff)]]
Ta5d6ff right_action_items:
Ta5d6ff [
Ta5d6ff [Ta5d6ff'Ta5d6ffcloseTa5d6ff'Ta5d6ff, lambda x: root.app.close_any_action(self)],
Ta5d6ff ]
Ta5d6ff ScrollView:
Ta5d6ff id: utilities_scrollview
Ta5d6ff MDBoxLayout:
Ta5d6ff orientation: Ta5d6ff"Ta5d6ffverticalTa5d6ff"
Ta5d6ff size_hint_y: None
Ta5d6ff height: self.minimum_height
Ta5d6ff padding: [dp(28), dp(32), dp(28), dp(16)]
Ta5d6ff # MDLabel:
Ta5d6ff # text: Ta5d6ff"Ta5d6ffUtilities & ToolsTa5d6ff"
Ta5d6ff # font_style: Ta5d6ff"Ta5d6ffH6Ta5d6ff"
Ta5d6ff MDLabel:
Ta5d6ff id: utilities_info
Ta5d6ff markup: True
Ta5d6ff text: Ta5d6ff"Ta5d6ff"
Ta5d6ff size_hint_y: None
Ta5d6ff text_size: self.width, None
Ta5d6ff height: self.texture_size[1]
Ta5d6ff MDBoxLayout:
Ta5d6ff orientation: Ta5d6ff"Ta5d6ffverticalTa5d6ff"
Ta5d6ff spacing: Ta5d6ff"Ta5d6ff24dpTa5d6ff"
Ta5d6ff size_hint_y: None
Ta5d6ff height: self.minimum_height
Ta5d6ff padding: [dp(0), dp(35), dp(0), dp(35)]
Ta5d6ff MDRectangleFlatIconButton:
Ta5d6ff id: rnstatus_button
Ta5d6ff icon: Ta5d6ff"Ta5d6ffwifi-checkTa5d6ff"
Ta5d6ff text: Ta5d6ff"Ta5d6ffReticulum StatusTa5d6ff"
Ta5d6ff padding: [dp(0), dp(14), dp(0), dp(14)]
Ta5d6ff icon_size: dp(24)
Ta5d6ff font_size: dp(16)
Ta5d6ff size_hint: [1.0, None]
Ta5d6ff on_release: root.delegate.rnstatus_action(self)
Ta5d6ff disabled: False
Ta5d6ff MDRectangleFlatIconButton:
Ta5d6ff id: logview_button
Ta5d6ff icon: Ta5d6ff"Ta5d6fflist-box-outlineTa5d6ff"
Ta5d6ff text: Ta5d6ff"Ta5d6ffLog ViewerTa5d6ff"
Ta5d6ff padding: [dp(0), dp(14), dp(0), dp(14)]
Ta5d6ff icon_size: dp(24)
Ta5d6ff font_size: dp(16)
Ta5d6ff size_hint: [1.0, None]
Ta5d6ff on_release: root.delegate.logviewer_action(self)
Ta5d6ff disabled: False
Ta5d6ff MDRectangleFlatIconButton:
Ta5d6ff id: flasher_button
Ta5d6ff icon: Ta5d6ff"Ta5d6ffradio-handheldTa5d6ff"
Ta5d6ff text: Ta5d6ff"Ta5d6ffRNode FlasherTa5d6ff"
Ta5d6ff padding: [dp(0), dp(14), dp(0), dp(14)]
Ta5d6ff icon_size: dp(24)
Ta5d6ff font_size: dp(16)
Ta5d6ff size_hint: [1.0, None]
Ta5d6ff on_release: root.delegate.flasher_action(self)
Ta5d6ff disabled: False
Ta5d6ff MDRectangleFlatIconButton:
Ta5d6ff id: advanced_button
Ta5d6ff icon: Ta5d6ff"Ta5d6ffnetwork-posTa5d6ff"
Ta5d6ff text: Ta5d6ff"Ta5d6ffAdvanced RNS ConfigurationTa5d6ff"
Ta5d6ff padding: [dp(0), dp(14), dp(0), dp(14)]
Ta5d6ff icon_size: dp(24)
Ta5d6ff font_size: dp(16)
Ta5d6ff size_hint: [1.0, None]
Ta5d6ff on_release: root.delegate.advanced_action(self)
Ta5d6ff disabled: False
Ta5d6ff
Ta5d6ff"""
Te6edf3layout_rnstatus_screen Tff7b72= Ta5d6ff"""
Ta5d6ffMDScreen:
Ta5d6ff name: Ta5d6ff"Ta5d6ffrnstatus_screenTa5d6ff"
Ta5d6ff
Ta5d6ff BoxLayout:
Ta5d6ff orientation: Ta5d6ff"Ta5d6ffverticalTa5d6ff"
Ta5d6ff MDTopAppBar:
Ta5d6ff id: top_bar
Ta5d6ff title: Ta5d6ff"Ta5d6ffReticulum StatusTa5d6ff"
Ta5d6ff anchor_title: Ta5d6ff"Ta5d6ffleftTa5d6ff"
Ta5d6ff elevation: 0
Ta5d6ff left_action_items:
Ta5d6ff [[Ta5d6ff'Ta5d6ffmenuTa5d6ff'Ta5d6ff, lambda x: root.app.nav_drawer.set_state(Ta5d6ff"Ta5d6ffopenTa5d6ff"Ta5d6ff)]]
Ta5d6ff right_action_items:
Ta5d6ff [
Ta5d6ff # [Ta5d6ff'Ta5d6ffrefreshTa5d6ff'Ta5d6ff, lambda x: root.delegate.update_rnstatus()],
Ta5d6ff [Ta5d6ff'Ta5d6ffcloseTa5d6ff'Ta5d6ff, lambda x: root.delegate.close_rnstatus_action(self)],
Ta5d6ff ]
Ta5d6ff MDScrollView:
Ta5d6ff id: rnstatus_scrollview
Ta5d6ff size_hint_x: 1
Ta5d6ff size_hint_y: None
Ta5d6ff size: [root.width, root.height-root.ids.top_bar.height]
Ta5d6ff do_scroll_x: False
Ta5d6ff do_scroll_y: True
Ta5d6ff MDGridLayout:
Ta5d6ff cols: 1
Ta5d6ff padding: [dp(28), dp(14), dp(28), dp(28)]
Ta5d6ff size_hint_y: None
Ta5d6ff height: self.minimum_height
Ta5d6ff MDLabel:
Ta5d6ff id: rnstatus_output
Ta5d6ff markup: True
Ta5d6ff text: Ta5d6ff"Ta5d6ff"
Ta5d6ff size_hint_y: None
Ta5d6ff text_size: self.width, None
Ta5d6ff height: self.texture_size[1]
Ta5d6ff"""
Te6edf3layout_logviewer_screen Tff7b72= Ta5d6ff"""
Ta5d6ffMDScreen:
Ta5d6ff name: Ta5d6ff"Ta5d6fflogviewer_screenTa5d6ff"
Ta5d6ff
Ta5d6ff BoxLayout:
Ta5d6ff orientation: Ta5d6ff"Ta5d6ffverticalTa5d6ff"
Ta5d6ff MDTopAppBar:
Ta5d6ff id: top_bar
Ta5d6ff title: Ta5d6ff"Ta5d6ffLog ViewerTa5d6ff"
Ta5d6ff anchor_title: Ta5d6ff"Ta5d6ffleftTa5d6ff"
Ta5d6ff elevation: 0
Ta5d6ff left_action_items:
Ta5d6ff [[Ta5d6ff'Ta5d6ffmenuTa5d6ff'Ta5d6ff, lambda x: root.app.nav_drawer.set_state(Ta5d6ff"Ta5d6ffopenTa5d6ff"Ta5d6ff)]]
Ta5d6ff right_action_items:
Ta5d6ff [
Ta5d6ff [Ta5d6ff'Ta5d6ffcontent-copyTa5d6ff'Ta5d6ff, lambda x: root.delegate.logviewer_copy()],
Ta5d6ff [Ta5d6ff'Ta5d6ffcloseTa5d6ff'Ta5d6ff, lambda x: root.app.close_sub_utilities_action(self)],
Ta5d6ff ]
Ta5d6ff MDScrollView:
Ta5d6ff id: logviewer_scrollview
Ta5d6ff size_hint_x: 1
Ta5d6ff size_hint_y: None
Ta5d6ff size: [root.width, root.height-root.ids.top_bar.height]
Ta5d6ff do_scroll_x: False
Ta5d6ff do_scroll_y: True
Ta5d6ff MDGridLayout:
Ta5d6ff cols: 1
Ta5d6ff padding: [dp(28), dp(14), dp(28), dp(28)]
Ta5d6ff size_hint_y: None
Ta5d6ff height: self.minimum_height
Ta5d6ff MDLabel:
Ta5d6ff id: logviewer_output
Ta5d6ff markup: True
Ta5d6ff text: Ta5d6ff"Ta5d6ff"
Ta5d6ff size_hint_y: None
Ta5d6ff text_size: self.width, None
Ta5d6ff height: self.texture_size[1]
Ta5d6ff MDLabel:
Ta5d6ff id: slogviewer_output
Ta5d6ff markup: True
Ta5d6ff text: Ta5d6ff"Ta5d6ff"
Ta5d6ff size_hint_y: None
Ta5d6ff text_size: self.width, None
Ta5d6ff height: self.texture_size[1]
Ta5d6ff"""
Te6edf3layout_advanced_screen Tff7b72= Ta5d6ff"""
Ta5d6ffMDScreen:
Ta5d6ff name: Ta5d6ff"Ta5d6ffadvanced_screenTa5d6ff"
Ta5d6ff
Ta5d6ff BoxLayout:
Ta5d6ff orientation: Ta5d6ff"Ta5d6ffverticalTa5d6ff"
Ta5d6ff MDTopAppBar:
Ta5d6ff id: top_bar
Ta5d6ff title: Ta5d6ff"Ta5d6ffRNS ConfigurationTa5d6ff"
Ta5d6ff anchor_title: Ta5d6ff"Ta5d6ffleftTa5d6ff"
Ta5d6ff elevation: 0
Ta5d6ff left_action_items:
Ta5d6ff [[Ta5d6ff'Ta5d6ffmenuTa5d6ff'Ta5d6ff, lambda x: root.app.nav_drawer.set_state(Ta5d6ff"Ta5d6ffopenTa5d6ff"Ta5d6ff)]]
Ta5d6ff right_action_items:
Ta5d6ff [
Ta5d6ff # [Ta5d6ff'Ta5d6ffrefreshTa5d6ff'Ta5d6ff, lambda x: root.delegate.update_rnstatus()],
Ta5d6ff [Ta5d6ff'Ta5d6ffcloseTa5d6ff'Ta5d6ff, lambda x: root.app.close_sub_utilities_action(self)],
Ta5d6ff ]
Ta5d6ff MDScrollView:
Ta5d6ff id: advanced_scrollview
Ta5d6ff size_hint_x: 1
Ta5d6ff size_hint_y: None
Ta5d6ff size: [root.width, root.height-root.ids.top_bar.height]
Ta5d6ff do_scroll_x: False
Ta5d6ff do_scroll_y: True
Ta5d6ff MDGridLayout:
Ta5d6ff cols: 1
Ta5d6ff padding: [dp(28), dp(14), dp(28), dp(28)]
Ta5d6ff size_hint_y: None
Ta5d6ff height: self.minimum_height
Ta5d6ff MDBoxLayout:
Ta5d6ff orientation: Ta5d6ff"Ta5d6ffhorizontalTa5d6ff"
Ta5d6ff spacing: dp(24)
Ta5d6ff size_hint_y: None
Ta5d6ff height: self.minimum_height
Ta5d6ff padding: [dp(0), dp(14), dp(0), dp(24)]
Ta5d6ff MDRectangleFlatIconButton:
Ta5d6ff id: conf_copy_button
Ta5d6ff icon: Ta5d6ff"Ta5d6ffcontent-copyTa5d6ff"
Ta5d6ff text: Ta5d6ff"Ta5d6ffCopy ConfigurationTa5d6ff"
Ta5d6ff padding: [dp(0), dp(14), dp(0), dp(14)]
Ta5d6ff icon_size: dp(24)
Ta5d6ff font_size: dp(16)
Ta5d6ff size_hint: [1.0, None]
Ta5d6ff on_release: root.delegate.copy_config(self)
Ta5d6ff disabled: False
Ta5d6ff MDRectangleFlatIconButton:
Ta5d6ff id: conf_paste_button
Ta5d6ff icon: Ta5d6ff"Ta5d6ffdownloadTa5d6ff"
Ta5d6ff text: Ta5d6ff"Ta5d6ffPaste ConfigurationTa5d6ff"
Ta5d6ff padding: [dp(0), dp(14), dp(0), dp(14)]
Ta5d6ff icon_size: dp(24)
Ta5d6ff font_size: dp(16)
Ta5d6ff size_hint: [1.0, None]
Ta5d6ff on_release: root.delegate.paste_config(self)
Ta5d6ff disabled: False
Ta5d6ff MDBoxLayout:
Ta5d6ff orientation: Ta5d6ff"Ta5d6ffhorizontalTa5d6ff"
Ta5d6ff spacing: dp(24)
Ta5d6ff size_hint_y: None
Ta5d6ff height: self.minimum_height
Ta5d6ff padding: [dp(0), dp(0), dp(0), dp(24)]
Ta5d6ff MDRectangleFlatIconButton:
Ta5d6ff id: conf_reset_button
Ta5d6ff icon: Ta5d6ff"Ta5d6ffcog-counterclockwiseTa5d6ff"
Ta5d6ff text: Ta5d6ff"Ta5d6ffReset ConfigurationTa5d6ff"
Ta5d6ff padding: [dp(0), dp(14), dp(0), dp(14)]
Ta5d6ff icon_size: dp(24)
Ta5d6ff font_size: dp(16)
Ta5d6ff size_hint: [1.0, None]
Ta5d6ff on_release: root.delegate.reset_config(self)
Ta5d6ff disabled: False
Ta5d6ff MDLabel:
Ta5d6ff id: config_template
Ta5d6ff markup: True
Ta5d6ff text: Ta5d6ff"Ta5d6ff"
Ta5d6ff size_hint_y: None
Ta5d6ff text_size: self.width, None
Ta5d6ff height: self.texture_size[1]
Ta5d6ff"""
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────